package net.xinqushi.gc;

/**
 * @author xjie 2019/10/29 11:14
 * @description GCRoots 回收
 *  可作为GCRoots的对象类型
 *    虚拟机栈的栈帧的局部变量表所引用的对象；
 *    本地方法栈的JNI所引用的对象；
 *    方法区的静态变量和常量所引用的对象；
 */
public class GCRoots {

    public static void main(String[] args) throws InterruptedException {
        /**
         *   栈帧局部变量表区域
         */
        Root root = new Root();
        root = null;
        Thread.sleep(1000L);
        for (int i = 0; i < 5; i++) {
            System.gc();
        }
    }
    public static class Root extends FinalizedAware{

        /**
         *   堆对象成员变量区域
         */
        int a = 1; 
        
        Bean1 name = new Bean1(); // 回收

        /**
         *  静态方法区区域
         */
        static Bean2 c = new Bean2(); // 方法区对象独立作为GCRoots 头节点
    }

    static class FinalizedAware{
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println(this.getClass() + " finalized ...");
            System.out.println("hello everybody");
        }


    }

    static class Bean1 extends FinalizedAware{ }
    static class Bean2 extends FinalizedAware{ }
    static class Bean3 extends FinalizedAware{ }


}
